/*  PLUTO JS -Scripting Web Server.
    Copyright (C) 2013 vivek gangadharan

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/
package pluto.js;

import pluto.scriptlet.ErrorDispatcher;
import pluto.scriptlet.Node;
import pluto.scriptlet.Parser;
import pluto.scriptlet.ScriptletReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
import java.io.StringReader;
import org.mozilla.javascript.Context;
import org.mozilla.javascript.Scriptable;
import org.mozilla.javascript.ScriptableObject;
import pluto.core.ApplicationConfiguration;
import pluto.core.Host;
import pluto.http.HTTPRequest;
import pluto.http.HTTPResponse;
import pluto.js.api.Request;
import pluto.js.api.Response;

public class JSScriptletExecutor {

    public static void callJSScriplet(final Host host, final ApplicationConfiguration config, final File scriptletFile, final JSCallBack callback, final HTTPRequest req, final HTTPResponse res) {
        Context context = null;
        try {
            ScriptletReader reader = new ScriptletReader(new InputStreamReader(new FileInputStream(scriptletFile)), new ErrorDispatcher());
            Node.Nodes nodes = Parser.parse(reader);
            String scriptCode = Node.Visitor.generate(nodes);
            if (scriptCode != null) {
                context = Context.enter();
                //set default context type html
                res.type("text/html");
                Scriptable threadScope = context.newObject(host.global());
                threadScope.setPrototype(host.global());
                threadScope.setParentScope(null);
                ScriptableObject.putProperty(threadScope, "req", new Request(req));
                ScriptableObject.putProperty(threadScope, "res", new Response(res));
                Object result = context.evaluateReader(threadScope, new StringReader(scriptCode), scriptletFile.getName(), 0, null);
                callback.sucess(context, result, req, res);
            } else {
                callback.failed(context, new Exception("Nothing to process in scriptlet"), req, res);
            }
        } catch (Exception e) {
            callback.failed(context, e, req, res);
        } finally {
            Context.exit();
        }
    }
}
